home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / vgagraph.zip / BGI.C < prev    next >
C/C++ Source or Header  |  1993-12-12  |  5KB  |  243 lines

  1. #include <math.h>
  2. #include <string.h>
  3. #include <alloc.h>
  4. #include <io.h>
  5. #include <fcntl.h>
  6. #include <dos.h>
  7. #include <stdlib.h>
  8. #include <stat.h>
  9. #include "allproc.h"
  10.  
  11. long dx,dy,dsh,hhy,nhhy,hy;
  12. unsigned int  bgilen,wxx,offs,xs,ys;
  13. unsigned char base;
  14. unsigned char tabl[18],coly[600];
  15. char *fontptr;
  16. char *ch;
  17.  
  18. void sizechar(float x,float y,int typf)
  19. {
  20.       dx=floor(64*x);
  21.       dy=floor(64*y);
  22.       hhy=(((hy*dy) >> 6)*11) >> 3;
  23.       nhhy=((hhy*(dx >> 4))/(dy >> 4))/30;
  24.       if (typf==1) nhhy=0;
  25. }
  26. char ldfontbgi(char *fname,char *p)
  27. {
  28. int       f;
  29. long      l;
  30. unsigned int i,j,k;
  31. char     *ch;
  32.  
  33.  if (strlen(fname)!=0)
  34.     {
  35.      f=open(fname,O_BINARY | S_IREAD);
  36.      if (f==-1) return(1);
  37.      l = filelength(f);
  38.      bgilen=l;
  39.  
  40.      if (coreleft()<l) return(1);
  41.      fontptr=(char *)malloc(l);
  42.      read(f,fontptr,l);
  43.      close(f);
  44.  
  45.     ch=fontptr;
  46.     if ((ch[0]!='P') || (ch[1]!='K') ||
  47.        (ch[2]!=8) || (ch[3]!=8))
  48.        { free(fontptr);return(1);}
  49.     }
  50.     else
  51.     {
  52.     fontptr=p;
  53.     ch=p;
  54.     if ((ch[0]!='P') || (ch[1]!='K') || (ch[2]!=8) || (ch[3]!=8)) return(1);
  55.     bgilen=0;
  56.     }
  57.     i = 0;
  58.     while ((ch[i]!=0x1A) || (i==l)) i=i+1;
  59.     if (i==l) return(1);
  60.  
  61.     base=ch[i+1];
  62.     for (i=0;i<=16;i++) tabl[i]=ch[base+i];
  63.     offs=base+(long)(tabl[6] << 8) + (long)(tabl[5]);
  64.     i=tabl[10];
  65.     j=tabl[8];
  66.     i=256-i;
  67.     hy=j+i;
  68.  
  69.     return(0);
  70. }
  71. void freefontbgi()
  72. {
  73.      if (bgilen!=0) free(fontptr);
  74. }
  75. int test_coord(unsigned int xy)
  76. {
  77.  asm{
  78.     mov    cx,xy
  79.     xchg    ch,cl
  80.     xor    ax,ax
  81.     test    ch,0x80
  82.     je    m1
  83.     mov    ax,2
  84.     }
  85.  m1:
  86.     asm{
  87.     test    cl,0x80
  88.     je    m2
  89.     inc    al
  90.     }
  91.  m2:
  92.     return(_AX);
  93. }
  94.  
  95. unsigned int convert_xy(char x)
  96. {
  97. char cod;
  98. unsigned int i;
  99.  
  100.  asm{
  101.     push    dx
  102.     mov    al,x
  103.     xor    dx,dx
  104.     and    al,0x7F
  105.     mov    bl,al
  106.     xor    bh,bh
  107.     and    al,0x40
  108.     je    m1
  109.     dec    bh
  110.     dec    dx
  111.     or    bl,0x80
  112.     }
  113.   m1:   asm{
  114.     mov    ax,bx
  115.     pop     dx
  116.     }
  117.  return(_AX);
  118. }
  119. void lines(int x1,int y1,int x2,int y2,int typ,int cole)
  120. {
  121. int i,w,d,dx,dy,x,y,ainc,binc,yinc,xinc;
  122.  
  123.       if ((typ==0) || (peekb(0x0,0x0449)!=0x13))
  124.          for (i=0;i<=nhhy;i++) line(x1+i,y1,x2+i,y2,cole);
  125.       else
  126.       {
  127.       dx=x2-x1;
  128.       dy=y2-y1;
  129.       if (abs(dx)>=abs(dy))
  130.       {
  131.       if (x1>x2){ w=x1;x1=x2;x2=w;w=y1;y1=y2;y2=w;}
  132.       if (y2>y1) yinc=1; else yinc=-1;
  133.       dx=x2-x1;
  134.       dy=abs(y2-y1);
  135.       d=dy*2 - dx;
  136.       ainc=(dy-dx)*2;
  137.       binc=dy*2;
  138.       x=x1;
  139.       y=y1;
  140.       line(x,y,x+nhhy,y,coly[y-ys]);
  141.       for (x=(x1+1);x<=x2;x++)
  142.       {
  143.       if (d>0)
  144.          {
  145.          y+=yinc;
  146.          d+=ainc;
  147.          }
  148.       else d+=binc;
  149.       line(x,y,x+nhhy,y,coly[y-ys]);
  150.       }
  151.       }
  152.       else
  153.       {
  154.       if (y1>y2){ w=x1;x1=x2;x2=w;w=y1;y1=y2;y2=w;}
  155.       if (x2>x1) xinc=1; else xinc=-1;
  156.       dy=y2-y1;
  157.       dx=abs(x2-x1);
  158.       d=dx*2 - dy;
  159.       ainc=(dx-dy)*2;
  160.       binc=dx*2;
  161.       x=x1;
  162.       y=y1;
  163.       line(x,y,x+nhhy,y,coly[y-ys]);
  164.       for (y=(y1+1);y<=y2;y++)
  165.       {
  166.       if (d>0)
  167.          {
  168.          x+=xinc;
  169.          d+=ainc;
  170.          }
  171.       else d+=binc;
  172.       line(x,y,x+nhhy,y,coly[y-ys]);
  173.       }
  174.       }
  175.       }
  176. }
  177. void bgitext(int x00,int y00,char *str,char cols,char cole,char typ)
  178. {
  179. long xx1,yy1,xx2,yy2,xxx,yyy,k;
  180. long  x0,y0,x,y,j,i,x1,y1,x2,y2;
  181. unsigned int ofs1,xy;
  182.  
  183.  if (peekb(0x0,0x0449)!=0x13)
  184.        for (i=1;i<=hhy;i++) coly[i]=cole;
  185.     else
  186.     {
  187.     if (typ==0) for (i=0;i<=hhy;i++) coly[i]=cols;
  188.     if (typ==1) for (i=0;i<=hhy;i++) coly[i]=((cols-cole)*(i-1))/(hhy-1)+cole;
  189.     j=(hhy*6)/10;
  190.     if (typ==2)
  191.     for (i=0;i<=hhy;i++) if (i<j) coly[i]=((cole-cols)*(i-1))/(j-1)+cols;
  192.        else coly[i]=((cols-cole)*(i-j))/(j-1)+cole;
  193.      }
  194.  
  195.  
  196.  x=x00;y=y00;
  197.  ys=y00;
  198.  x00=((x00*dx) >> 6)-x00;
  199.  y00=((y00*dy) >> 6)-y00;
  200.  
  201.  
  202.  
  203.  for (i=0;i<strlen(str);i++)
  204.    {
  205.    k=((int)(str[i]) - (int)(tabl[4]))*2 + 0x10+base;
  206.    ch = fontptr;
  207.    ofs1=(unsigned char )ch[k]+((unsigned char )(ch[k+1]) << 8);
  208.    ch = (fontptr+offs+ofs1);
  209.    j=0;x1=0;y1=0;
  210.  
  211. L:   xy = (unsigned char )ch[j*2]+((unsigned char )(ch[j*2+1]) << 8);
  212.      j=j+1;
  213.      k=test_coord(xy);
  214.  
  215.      if (k==2)
  216.      {
  217.      x1 = convert_xy( xy & 0xFF);
  218.      y1 = convert_xy( xy >> 8 );
  219.      }
  220.      if (k==3)
  221.      {
  222.      x2 = convert_xy( xy & 0xFF);
  223.      y2 = convert_xy( xy >> 8 );
  224.      x0 = x1; y0 = y1; x1 = x2; y1 = y2;
  225.      xx1=((x+x0)*dx) >> 6;
  226.      yy1=((y+hy-y0)*dy) >> 6;
  227.      xx2=((x+x2)*dx) >> 6;
  228.      yy2=((y+hy-y2)*dy) >> 6;
  229.      xx1=xx1-x00;
  230.      yy1=yy1-y00;
  231.      xx2=xx2-x00;
  232.      yy2=yy2-y00;
  233.      lines( xx1, yy1, xx2, yy2,typ,cols);
  234.      }
  235.        if (k==0)
  236.       {
  237.        x = x + x1 ;
  238.        }
  239.  
  240.    if ( k != 0) goto L;
  241. }
  242. }
  243.